Neil, thank so you so much for your response... you Rock!
I understand your response but unfortunately this is not how ArcMap seems to be working. Here's my test:
1) I created a new Window class library project in Visual Studio 2010. This library has one class with one method that returns the version number of the executing assembly (i.e. the DLL version number).
2) I then created an ArcMap add-in using Visual Studio. The Add-in has one button. Clicking the button calls the windows class library DLL and calls the "get version number" method and displays it in a message box.
3) I incremented the version number of the windows class library and rebuilt it.
3) Finally, I created another ArcMap add-in using Visual Studio. Again, one button that shows the version number of the windows class library DLL.
Launching ArcMap, adding the add-in buttons to a toolbar and then clicking both buttons shows the same version in both. i.e. ArcMap - I think because it is a single process application - is only loading the shared DLL once (the load order of the add-ins probably determines which version gets loaded).
Note that I tried this experiment twice. Once using two Visual Studio solutions and loading the windows class library project into both,as a "project" reference to each of the add-in projects. When this didn't work, I removed the windows class library projects/references and built the class library separately, copying the DLLs into the add-in projects by hand and then adding them as references from there.
One final note, I have opened the add-in files using 7Zip and sure enough, each add-in is getting the correct windows class DLL. The add-ins are getting different versions.
I would be extremely grateful to anyone with a workaround! My next experiment is to try and get Visual Studio to give the shared DLL a different build file name depending on which add-in it is being used in.