I've played with this a lot – not sure its feasible. As you say, you can't directly construct the resulting session object, so you can't return a session. The only solution would be to mock whatever is using the session also, like Invoke-Command or whatever. That way you don't need a session. You basically mock all Remoting 🙂
I'll go this route for now. If there is a better way, then this would be juicy info for the "Mocking the Unmockable" section!
In my case I am trying to mock Invoke-Command. My implementation of Invoke-Command uses a session parameter, which Invoke-Command attempts to validate. Since I can't create a mock PSSession object, the parameter validation fails, which causes the mock of Invoke-Command to fail.