The most likely reason you are having problems with non-root mounts is the "secure" export option, which is on by default. It disallows mount requests that come in with a source port greater than 1024. On most systems, binding to a port less than 1024 requires root access, so this is a fairly decent way of ensuring the mount was made by root.
The issue, as explained in the README for my NfSpy penetration testing tool, is that the NFS protocol (versions 2, 3, and even 4, without proper configuration) completely trusts the user ID sent in requests from client machines. By limiting requests to only those made by root, you limit your trust to only users on the client machine who have root access. Without this setting (using "insecure" in your exports file), any user can claim to have any UID and access any file on the export.
The reason it is working on Linux is probably because /bin/mount is setuid root:
~$ ls -l /bin/mount
-rwsr-xr-x 1 root root 72188 2011-01-20 13:54 /bin/mount
Just a hunch, but check the permissions on the mount binary on your FreeBSD system. If it is setuid, then you still have a problem, and I don't know what it is. If not, then that would explain what's going on.
Good luck with this, but please consider the security implications of allowing any user on a system to access any file on your server. I recommend using NFS4 with GSS authentication mechanisms instead of the traditional AUTH_SYS flavor.
Try changing your exports file to...
/media/nfsshare *(rw,sec=sys,sync,no_root_squash)
Best Answer
You can create snapshots through NFS by creating directories in the .zfs directory of each dataset. That special directory can be hidden or not (but still accessible).
ZFS is a hierarchical filesystem, just create individual datasets for each user within other datasets (e.g department/user1 department/user2 etc). They will inherit the properties or you can overwrite those too.
With clones you can save some disk space. If all your users need a initial set of files in their directories, put them in a dataset, snapshot it and clone for each user. You won't be able to delete the snapshot while there are clones depending on it.
Custom dataset properties and clones must be managed from the server side. As far as I know, there are proprietary plug-ins that export ZFS specifics to VMware and the like. There is not a distributed FS protocol that will allow that though. You could create a web front-end and let users manipulate them.