If the Include attribute value includes an asterisk (even if escaped as hex) then a pattern match is attempted against the filesystem, and you end up with nothing in the group.
After several hours of messing about, I came up with a solution building the pattern with the word STAR instead of an asterisk, and using an inline C# Target to create a TaskItem with the correct text.
Here is the result, in a .proj file at the solution level and using the NuGet packages for OpenCover, NUnit.Runners and ReportGenerator.
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Clean" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<OpenCoverVersion>4.5.1403</OpenCoverVersion>
<NUnitVersion>2.6.2</NUnitVersion>
<ReportGeneratorVersion>1.8.0.0</ReportGeneratorVersion>
</PropertyGroup>
<ItemGroup>
<TestedNamespace Include="MyCode">
<TestsNamespace>MyCode.Tests</TestsNamespace>
</TestedNamespace>
<TestedNamespace Include="MyWebStuff">
<TestsNamespace>MyWebStuff.Tests</TestsNamespace>
</TestedNamespace>
<ReportFiles Include="@(TestedNamespace->'OpenCover\%(TestsNamespace).opencover.xml')"/>
</ItemGroup>
<PropertyGroup>
<Configuration Condition="'$(Configuration)' == ''">Release</Configuration>
<OpenCoverPath>$(MSBuildProjectDirectory)\packages\OpenCover.$(OpenCoverVersion)</OpenCoverPath>
<OpenCoverMSBuildTasksPath>$(OpenCoverPath)\MSBuild</OpenCoverMSBuildTasksPath>
<OpenCoverPath>$(MSBuildProjectDirectory)\packages\OpenCover.$(OpenCoverVersion)</OpenCoverPath>
<OpenCoverMSBuildTasksPath>$(OpenCoverPath)\MSBuild</OpenCoverMSBuildTasksPath>
<NUnitRunner>$(MSBuildProjectDirectory)\packages\NUnit.Runners.$(NUnitVersion)\tools\nunit-console-x86.exe</NUnitRunner>
<ReportGenerator>$(MSBuildProjectDirectory)\packages\ReportGenerator.$(ReportGeneratorVersion)\ReportGenerator.exe</ReportGenerator>
</PropertyGroup>
<Import Project="$(OpenCoverMSBuildTasksPath)\OpenCover.targets"/>
<UsingTask AssemblyFile="$(ReportGenerator)" TaskName="ReportGenerator"/>
<UsingTask TaskName="TurnSTARintoActualStar" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<Input ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
<Result ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs">
<![CDATA[
if (Input.Length > 0)
{
Result = new TaskItem[Input.Length];
for (int i = 0; i < Input.Length; i++)
{
ITaskItem item = Input[i];
Result[i] = new TaskItem(item.GetMetadata("Identity").Replace("STAR", "*"));
}
}
]]>
</Code>
</Task>
</UsingTask>
<Target Name="Clean">
<RemoveDir Directories="OpenCover" />
<CallTarget Targets="Report"/>
</Target>
<Target Name="Report" DependsOnTargets="Build">
<ReportGenerator
TargetDirectory="OpenCover\Report"
ReportTypes="Html"
ReportFiles="@(ReportFiles)"
/>
</Target>
<Target Name="Build" Inputs="@(TestedNamespace)" Outputs="OpenCover\%(TestsNamespace).opencover.xml">
<MakeDir Directories="OpenCover" />
<CreateItem Include="+[%(TestedNamespace.Identity)STAR]STAR;-[%(TestedNamespace.TestsNamespace)]STAR;-[%(TestedNamespace.Identity)STAR]%(TestedNamespace.Identity).Properties.STAR">
<Output TaskParameter="Include" ItemName="SafeFilters" />
</CreateItem>
<CreateItem Include="$(MSBuildProjectDirectory)\%(TestedNamespace.TestsNamespace)\bin\$(Configuration)\%(TestedNamespace.TestsNamespace).dll">
<Output TaskParameter="Include" PropertyName="TestsAssemblyPath" />
</CreateItem>
<CreateItem Include='"$(TestsAssemblyPath)" /noshadow /xml:"OpenCover\%(TestedNamespace.TestsNamespace).nunit.xml"'>
<Output TaskParameter="Include" PropertyName="NUnitArgs" />
</CreateItem>
<CreateItem Include="@(TestedNamespace->'OpenCover\%(TestsNamespace).opencover.xml')">
<Output TaskParameter="Include" PropertyName="OpenCoverXml" />
</CreateItem>
<TurnSTARintoActualStar Input="@(SafeFilters)">
<Output ItemName="Filters" TaskParameter="Result" />
</TurnSTARintoActualStar>
<OpenCover
ToolPath="$(OpenCoverPath)"
Register="True"
Target="$(NUnitRunner)"
TargetArgs='$(NUnitArgs)'
Output="$(OpenCoverXml)"
CoverByTest="$(TestsAssemblyPath)"
Filter="@(Filters)"/>
</Target>
</Project>