James,
I 'm doing something equivalent, but with code shared between ASP.NET, Silverlight 2 and WPF.
The approach I'm using is to create 3 DLL projects, one for each target. The source files are then inserted in each project, using a link. In the projects, I define conditionals that I can use in the source code, to remove part of the code that is not available (or not useful) in a specified target (for example, SQL definitions in Silverlight 2).
The DLLs contains all the code that is shared by more than a target. I then create a "main" DLL or EXE (for WPF), that contains the code that is specific to a target. In a perfect world, the WPF exe should contain only the application definitionand, eventually, the command-line parameters. In the case, I'm actually writing, there is more than a single WPF application with the same code base (they are making things really too different between them to use the same UI).
The problem of creating a single project is that the frameworks are not the same between Silverlight 2 and the other target, so the assembly created for WPF cannot normaly be used in a Silverlight project. Even if it can be used, there is a risk to use a method that doesn't exist in Silverlight and to see the error only at runtime. This approach leaves also open the door for a Compact Framework port with the same code source (with a 4th DLL project, of course).
At the end, I have 6 projects in the solution and I can compile the three application at the same time.
Patrick