It looks like you're running into a lambda "issue" (see this
for an example). When you use a single variable 'x', then it will actually share that variable for each instance and usually have its final value instead of what you are thinking.
Try doing this instead:
var y = x;
.. then when setting up your binding, use 'y' instead:
Binding.Delegate<DataRow, string>(r => r[y].ToString())
Hope this helps!