I believe there is an error in this function.
float area = GetSignedArea();
if (area > 0)
If Farseer is using CCW ordering of vertices, then a signed area that is LESS THAN 0 would mean that the ordering needs to be reversed, correct?
I'm far from familiar with physics, so I could be wrong. However this function didn't work for me until I made that change, and I believe it's currently incorrect.