Have you looked at using reflection?
I few years ago, I had to load and use assemblies that were changing at runtime.
This is how I did it:
string pathToAssembly = Path.Combine(Application.StartupPath, "myAssemby.dll");
object parameters = null;
Assembly assembly = Assembly.LoadFile(pathToAssembly);
Type type = assembly.GetType("MyAssembly.Form1");
MethodInfo methodInfo = type.GetMethod("ShowDialog", Type.EmptyTypes);
object instance = Activator.CreateInstance(type);