I've never setup a multi -> single git repo up, but I imagine that it could work with some fancy shell scripting.
Regarding the working tree, I think you're right by default there isn't one, but how I was using the post-receive hooks I defined one.
while read oldrev newrev ref
if [[ $ref =~ .*/deploy$ ]];
echo "Deploy ref received. Deploying branch to preview..."
git --work-tree=/var/www/html/project-name --git-dir=/var/repositories/project-name/git checkout -f deploy
echo "Ref $ref successfully received. Doing nothing: no work-tree with that branch name found on this server."
So in my example from that medium post, I have defined my working tree as website.com/project-name, but the git repository is actually stored elsewhere on the server which shouldn't be accessible by the public.
I guess you could create a bare repo point, that takes in your ref and branch and figures out where to create that working tree and git dir.