Oh dear, I feel bad about answering my own question but I worked out what was going wrong and I hope this will help anyone else who gets in this situation. I was unable to find anything on google about this.
So the issue is, even when you create a proxy that wraps an existing object (i.e. with CreateClassProxyWithTarget) it still creates a whole new object. It just happens that that object has a way of getting the wrapped object. For any methods, properties, etc. that you do not intercept they will be called on the proxy object. And in the case of properties, these will not use the value in the wrapped object, even if the properties are virtual because the proxy object has its own copy of all those properties.
To solve this, you have to get rid of your selection hook and just intercept everything. If it is a property you don't actually want to intercept you can simply call invocation.Proceed
. This will cause it to forward the request to the wrapped object.