Прежде всего, вы можете начать с создания условного символа компиляции, который позволяет включать или исключать дополнительные функции, доступные только для платформы .NET4.0.
Кроме того, я думаю, что вам придется использовать MSBuild напрямую, а не позволять VS.NET создавать свой проект.
Я сделал нечто подобное однажды. Короче говоря, все сводится к тому, что вам нужно создать 2 задачи сборки в вашем скрипте MSbuild. Тот, который позволяет вам создать свой проект для .NET 3.5, и тот, который позволяет вам создать проект с таргетингом на .NET 4.0.
В каждой задаче сборки вы можете определить целевой фреймворк и символ условной компиляции, который вы хотите использовать.
Задачи сборки в вашем скрипте сборки могут выглядеть так:
<Target Name="buildall-v4">
<!-- The following ItemGroup defines all the build-constants that have to be used
in the build.
As can be seen, the DEBUG & RELEASE constants are only included when necessary -->
<ItemGroup>
<BuildConstant Include="DEBUG" Condition="'$(buildmode)'=='DEBUG'" />
<BuildConstant Include="RELEASE" Condition="'$(buildmode)'=='RELEASE'" />
<BuildConstant Include="NET_FRAMEWORK_4_0" />
</ItemGroup>
<PropertyGroup>
<BuildConstantsToUse>@(BuildConstant)</BuildConstantsToUse>
</PropertyGroup>
<MSBuild Projects="$(builddir)\Source\MyProject.sln"
Properties="OutputPath=$(outputdir)\v4;Configuration=$(buildmode);DefineConstants=$(BuildConstantsToUse);TargetFrameworkVersion=v4.0" />
</Target>
<Target Name="buildall-v3.5">
<!-- The following ItemGroup defines all the build-constants that have to be used
in the build.
As can be seen, the DEBUG & RELEASE constants are only included when necessary -->
<ItemGroup>
<BuildConstant Include="DEBUG" Condition="'$(buildmode)'=='DEBUG'" />
<BuildConstant Include="RELEASE" Condition="'$(buildmode)'=='RELEASE'" />
</ItemGroup>
<PropertyGroup>
<BuildConstantsToUse>@(BuildConstant)</BuildConstantsToUse>
</PropertyGroup>
<MSBuild Projects="$(builddir)\Source\MyProject.sln"
Properties="OutputPath=$(outputdir)\v3.5\;Configuration=$(buildmode);DefineConstants=$(BuildConstantsToUse);TargetFrameworkVersion=v3.5" />
</Target>
Конечно, когда вы захотите собрать для двух версий, вам придется выполнять каждую команду msbuild отдельно в командной строке.