Just make sure you have the DLLs marked as "Use any version". I'd use Interfaces as well. You have all your subcomponents implement a common interface with the main program. Since you can implement multiple interfaces, if your main program changes to the point where you need extra common functionality from the subcomponents, you build a second Interface object and implement that as well in all your new subcomponents.

A quick check of the Interface models they support will show your main program what versions of the subcomponents it has available and what modes of operation they support.

Also, if this is a commercial program, you should have a license scheme that takes into account your module options. This way, when they install the program, they can enter the license and it'll install/update the DLL files it needs, so hopefully, you never run into a mix-matched condition.