You can use MSBuild Copy task - it has several parameters that makes it more powerful rather than copy/xcopy friends from cmd. I believe that you are using build server (or type of this) to run msbuild command, so you are able to pass some additional parameters to extend your build process. If the amount of projects that need to perform copy operation is not large (up to 10 or so), you can use AfterBuild target to perform copy task:
<Target Name="AfterBuild">
<Copy SourceFiles="@(MySourceFiles)"
DestinationFolder="$(MyOuputPath)" />
</Target>
Where MySourceFiles is the msbuild item used to describe all files you need to copy.
You can try the solution from this thread
If the amount of projects is large - let me assume that the list of the files to be copied is the permanent, and you primarly focused on the c# project. You can create separate msbuild project, where you can specify this list, and the target to be executed:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
CopyDynamicLibrary
</BuildDependsOn>
<MyOuputPath>$(MSBuildThisFileDirectory)bin\$(Configuration)\$(Platform)\</MyOuputPath>
</PropertyGroup>
<ItemGroup>
<MySourceFile Include="$(MSBuildThisFileDirectory)Dir\File.ext" />
<MySourceFile Include="$(MSBuildThisFileDirectory)Dir\File1.ext" />
<!-- etc -->
</ItemGroup>
<Target Name="CopyDynamicLibrary">
<Copy SourceFiles="@(MySourceFiles)"
DestinationFolder="$(MyOuputPath)" />
</Target>
</Project>
After you have this file, you can run msbuild command like the following:
msbuild /* YourParameters */ /p:"CustomAfterMicrosoftCSharpTargets=PathToCommonFile"
Here CustomAfterMicrosoftCSharpTargets is the property used by Microsoft.CSharp.targets file to import project specified in it at the end.
You have large number of extensibility with msbuild, you only need to choose the right one.