It isn't wrong to inline the method by hand, it just isn't necessary. Inlining small methods is one of the standard optimizations performed by the jitter. That doesn't always happen, but on .NET 4.6.1 both the x86 and the x64 jitters do inline swap() in this sample code. And more, they also unroll the inner loop to produce two swaps per pass, the kind of hand-optimization programmers usually skip.
Properly benchmarking a .NET app isn't always that straight-forward. Very important to run the Release build of your program. And to not use the debugger. Albeit the latter is easy to fix, use Tools > Options > Debugging > General > untick the "Suppress JIT optimization" option. There is no good reason to turn it back on.
You can now also see the generated machine code, set a breakpoint on InsertionSort() and when it hits use Debug > Windows > Disassembly. Tends to make people's eyes bleed but it is quite easy to see that you get two inlined swaps(). I'll spare you the assembly dump, just have a look-see. And you should clearly see the difference in the measurement. Here's what I get:
Running it 5 times with swap() on a List with 50,000 random integers on x64:
00:00:05.4447216
00:00:05.2928558
00:00:05.6960587
00:00:05.2835343
00:00:05.2809591
Same test but now swap() inlined by hand:
00:00:05.3015856
00:00:05.2877402
00:00:05.6369775
00:00:05.2603384
00:00:05.2616389
Takes just as long, as it should.
I would be remiss to not show the results I get with List.Sort():
00:00:00.0075878
00:00:00.0073398
00:00:00.0076528
00:00:00.0078046
00:00:00.0066319