I just solved the issue "accidentially" with a little help from a typo.
The cause of the problem is that you can't reuse a parameter name in the OperationContract.
This code:
[OperationContract]
****.PrimeTime.BusinessObjects.ProjectDataset WriteProject(****.PrimeTime.BusinessObjects.ProjectDataset data, bool modifyRowState);
[OperationContract]
****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany(****.PrimeTime.BusinessObjects.CompanyDataset data, bool modifyRowState);
won't work because the "data" parameter is re-used with a different type. To make it work, I re-named all the parameters in the Interface so that their name is prefixed with the method name like this:
[OperationContract]
****.PrimeTime.BusinessObjects.ProjectDataset WriteProject(****.PrimeTime.BusinessObjects.ProjectDataset WriteProject_data, bool WriteProject_modifyRowState);
[OperationContract]
****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany(****.PrimeTime.BusinessObjects.CompanyDataset WriteCompany_data, bool WriteCompany_modifyRowState);
Solved.