One recommendation I'll make is to move all your add-ins to a fixed subdirectory of your app (or perhaps a config or registry entry). If you use a fixed subdirectory then you can use a post-build event to copy the files to the appropriate location and eliminate any debug-time problems I believe. For example your library assembly resides in the application directory along with all your other core assemblies. Plugins then go in an AddIns subdirectory (through a build step). When your app runs you will always run against the latest library assembly as it always gets built and placed in the app directory (because you will have a reference to it in your main project). The plugins always go into a subdirectory. You'll always load the latest versions in all cases.
If you want plugins to be able to use older versions of the library assembly then you should probably use the GAC but simply strongly-naming the class library and either renaming it based on the version # or placing it into version-specific subdirectories (which the GAC already does) will allow you to load plugins with different library assembly versions. However even in the framework loading multiple versions of the same class library is not really a good idea so compatibility wrappers in the library code is a better approach.
Michael Taylor - 4/16/07