This really depends on what you mean by "runtime" and what the goals are. For example, Jon and Bas have both hit on the idea of using Reflection to late bind a particular class and have it instantiated at Runtime. This is certainly one idea and you can even discover the methods on the object at runtime, if that is your goal
If you are using interfaces, you have a couple of additional options. The Microsoft Extensibility Framework (or MEF) might be an option you want to look at, as it includes discoverability and instantiation at runtime. The downside is the discovered class must adhere to the correct interface, but this is not a real issue in most cases.
If you know the classes you are loading, and they have the same interface (common theme), but want to instantiate different classes at runtime, IoC containers are an option. This is not particularly what you are asking about.
The dynamic keyword is not what you are looking for. It does load at runtime, but the dyanmic is more about the compiler not checking if the methods you are calling actually exist. Done incorrectly, you can end up with an interesting blowup when you call a method that does not exist. The main motivation I have seen for dyanamic is interaction with a dynamic language, like IronPython.