I split our projects up into 3 solutions and use the build rules functionality to achieve what we want.
We have a DB project which is totally the LLBLGen generated code, the build rule for this runs a batch file after successful compile to copy the output to a references folder of the appropriate version (we use seperate folders for different versions).
The BL (Business Logic) solution has all of our business managers and user controls defined within with references to the compiled output in our reference folder and again uses Build Rules to copy out to a references folder.
The last solution is the actual application, which contains references to the previous reference folders and really has no code other than instantiating our framework and initiating a call into the managers.
This works great for us, as we have a single DB project that anyone can check out add tables, procs, views etc. Compile and check back in, it is rarely checked out for more than 15 minutes at a time.
The BL is checked out by many developers, but they only check out the individual manager or user control they are currently working on.
And typically only 1 person has the application they are working on checked out since it isn't much more than a base framework that calls into the managers, very little code is actually here.
With this we reuse the db in all projects, and the managers over many projects, the only time we don't have perfect reuse is when we have to do com interop for legacy VB6 code to call the new .NET stuff, but that is minimal.
John