Dynamic binding in C# allows binding to occur at runtime rather than compile time. It is implemented using the Dynamic Language Runtime (DLR) which handles binding and execution. Dynamic binding is useful for accessing members with only a name at runtime, for interoperating with dynamic languages, and for letting an object decide how to handle calls. It has some restrictions like not supporting extension methods or resolving static members on dynamic types.