Another possible solution that is "cleaner" but not ideal...
Right now the login code is part of the main application. What I could possibly do is create a stand-alone "launcher" application. When logging into a specific server, the launcher determines what version the server is and launches the main application, specifying the required version in the command line args. The main app doesn't add the proxy DLLs as references (however it won't compile then I believe - how to do this?), instead subscribes to the Resolve events and specified which DLL to use based on the passed in version info.
When the user clicks on "Logout", the main app launches the launcher app again and exits. However at that point I might as well just make the main app only be able to connect to one version, and if connecting to a new version, simply exits and launches a new instance of itself.
I guess there are many ways to skin this cat... [what a horrible saying...]