We have a similar scenario like you, and we use a multi-purpose approach to solve it:
1) Client-specific changes are isolated from the main application through the use of interfaces, overridden methods, or new methods (when an existing one is not enough).
This ensures that the underlying application platform is backward compatible with existing solutions.
2) In the rare case when changes should be applied to all decisions, we have one main solution that we can use to update all projects.
3) Continuous integration: in each separate session, each automatic construction of each solution and messages on successful completion or failure are distributed to all developers so that responsible parties can correct any violations.
Due to responsibility (everyone knows who broke the assembly), there is a lot of (positive) pressure on the developers to ensure that they are not the ones that can cause the problem.
We use CruiseControl.Net with the subversion repository, but I'm sure there are many other solutions that will work with your repository.
source share