Ok i solved it but its really screwy.
What happened is the "Add service reference" generated code contains a namespace aka
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://myservice.com")]
But the XML serialization that you can perform manually does not include the namespace anywhere in the generated XML. If i specify using this code the XML serializer will break.
[MessageContract(IsWrapped = true,WrapperNamespace="http://myservice.com")]
The ONLY way to get it to work properly is to add the line specifing the namespace from the generated code back to the contract class, like so.
[XmlType(Namespace="http://myservice.com")]
public class MyContract {}
After this addition all the generated xml will contain the full namespace in each element and the deserializer will behave properly. Why it breaks on the WCF ism for namespace i have no idea. It works fine with the other WCF isms.
The reason it was partially working in the first place is that the previous developer added a method that manually inserted the namespaces on certain XML elements on the client side. Specifically those of the base class that were working correctly! I just didn't see the method being called because it was buried so deep.