Temos um problema semelhante, pois temos 109 projetos separados para lidar. Para responder às perguntas originais com base em nossas experiências:
1. Como você lida melhor com referências entre projetos
Usamos a opção de menu de contexto 'adicionar referência'. Se 'projeto' for selecionado, a dependência será adicionada ao nosso único arquivo de solução global por padrão.
2. Deve "copiar local" estar ativado ou desativado?
Fora de nossa experiência. A cópia extra apenas aumenta os tempos de construção.
3. Cada projeto deve ser compilado em sua própria pasta ou devem ser compilados na mesma pasta de saída (todos fazem parte do mesmo aplicativo)
Toda a nossa saída é colocada em uma única pasta chamada 'bin'. A ideia é que esta pasta seja a mesma de quando o software é implantado. Isso ajuda a evitar problemas que ocorrem quando a configuração do desenvolvedor é diferente da configuração de implantação.
4. As pastas de soluções são uma boa maneira de organizar as coisas?
Não em nossa experiência. A estrutura de pastas de uma pessoa é o pesadelo de outra. Pastas profundamente aninhadas apenas aumentam o tempo necessário para encontrar qualquer coisa. Temos uma estrutura completamente plana, mas nomeamos nossos arquivos de projeto, assemblies e namespaces da mesma forma.
Nossa forma de estruturar projetos conta com um único arquivo de solução. Construir isso leva muito tempo, mesmo que os próprios projetos não tenham mudado. Para ajudar com isso, geralmente criamos outro arquivo de solução de 'conjunto de trabalho atual'. Todos os projetos em que estamos trabalhando são adicionados a isso. Os tempos de compilação foram amplamente aprimorados, embora um problema que vimos é que o Intellisense falha para tipos definidos em projetos que não estão no conjunto atual.
Um exemplo parcial de nosso layout de solução:
\bin
OurStuff.SLN
OurStuff.App.Administrator
OurStuff.App.Common
OurStuff.App.Installer.Database
OurStuff.App.MediaPlayer
OurStuff.App.Operator
OurStuff.App.Service.Gateway
OurStuff.App.Service.CollectionStation
OurStuff.App.ServiceLocalLauncher
OurStuff.App.StackTester
OurStuff.Auditing
OurStuff.Data
OurStuff.Database
OurStuff.Database.Constants
OurStuff.Database.ObjectModel
OurStuff.Device
OurStuff.Device.Messaging
OurStuff.Diagnostics
...
[etc]