The Controlled by Parent sharing setting for Organization Wide Defaults on objects means that you plan to defer any sharing of records in this object to the shared parent records.
When doing so, the ContactShare table still exists, and ostensibly is still populated by the system for the purpose of query optimization, however any sharing done by the us (manual sharing, Apex managed sharing, assigning of ownership, roles, territories) is disabled.
You are undoubtedly running into this.
In other words, you will not be able to directly populate ContactShare with Apex code without choosing some other option besides Controlled by Parent.
At best you can share the Account parent with that user.
But if you have one requirement in your business that states the Account should drive sharing, and another that states some Contact records should be shared independent of Account access, this becomes a Business Analysis problem.
Controlled By Parent might be better labeled as "Always Controlled by Parent". That clearly isn't what your business is asking for.
Your options are:
- Live with Always Controlled By Parent
- Switch Contact to Private and begin to implement different controls around the sharing model to ensure that the right contacts are seen by the right people.