Since Visual Studio projects are processed by MSBuild they can be customized to your needs.
Importing a custom targets project file into your existing .vcxproj could look something like this:
<!--
...
way to the end of your .vcxproj file
-->
<!-- start of custom import part -->
<Import Project=".\YourInternal.targets" Condition="Exists('.\YourInternal.targets')" />
<!-- end of custom import part -->
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
Your .vcxproj will only contain the subset of items / configurations / commands you want to deliver to your customer - everything related to your internal build process will be contained in one or more .targets project file which will simply be exclued from deleivery to your customer.
For example if you have a internal Custom Build Step \ Execute Before \ Clean
you would remove it from your .vcxproj file and add it to your YourInternal.targets
project file:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<CustomBuildBeforeTargets>Clean</CustomBuildBeforeTargets>
</PropertyGroup>
</Project>
If you have a collection of items you need to extend for internal processing, you can concatenate the base set of your .vcxproj with additional items in your .targets file(s):
.vcxproj
...
<ItemGroup>
<ClInclude Include="Header.h" />
</ItemGroup>
...
.targets
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<!-- includes to items definded in your .vcxproj -->
<ClInclude Include="@(ClInclude)" />
<!-- add more items here -->
<ClInclude Include="Foo.h" />
<ClInclude Include="Bar.h" />
</ItemGroup>
</Project>
This examples merely scratch the surface of what you can achieve by extending your .vcxproj by MSBuild commands.