Мы поддерживаем несколько файлов проекта - по одному для каждой версии VS. Если мы добавляем классы в какую-то конкретную версию довольно часто, то, как вы уже упоминали, их нужно реплицировать в другие версии.
Мы также позаботимся о том, чтобы использовать директивы компиляции, такие как "#if DotNet35", чтобы "скрыть" области кода, которые могут существовать, скажем, в 2008 году, но слишком новые для 2005 года. Это полезно, если вы имеете дело с общим библиотека, используемая в проектах 2005 и 2008 годов.
Что касается ответа о многоцелевом таргетинге, это не сильно поможет, поскольку VS2k8 по-прежнему требует, чтобы файл решения был в формате 2k8. Это просто гарантирует, что конечный результат, то есть, что компилируется, может быть нацелен на конкретную версию фреймворка.