@ParameterNames1 is not at all how the parameter is called. Actually, the names are being passed in as the values (N'ParameterName'). The @RemoveUnused parameter seems completely random to me, as it does not occur in the calling code at all.

The full code for this can be found here: GitHub project at lines 61 and 228.

Edit: I've found that the issue is caused by calling the same procedure twice, with different result sets. So the first time I'm calling it with Query, the second time with Query. Why Dapper is having trouble with this scenario is still a mystery.