You have it basically correct.
File level virtualization is basically just a server that supports file sharing. It'll typically attempt to support a number of different protocols, such as SMB (aka CIFS -- originated on Windows), NFS (originated on Solaris), AFS (Appletalk File Protocol), possibly RFS, and possibly a few others.
Typically, those interfaces access a common pool of files, so one client might access a file via SMB, and another the same file via NFS, and so on.
Block level virtualization does virtualization at the level of SCSI/SATA commands. A physical storage device (e.g., a hard drive) has some number of blocks, and a set of commands to read and write blocks of data. Block level virtualization means imitating the same commands, so a device driver can transmit the same commands, and get the same results--but in this case, instead of using a dedicated SCSI connection, the commands and data might be transmitted over FibreChannel, or possibly even Ethernet.
Greatly simplified, the three look something like this:
Of course, those aren't the only way things can be done. For example, in the block virtualization stack, you could have an iSCSI initiator, in which case you'd typically have Ethernet in place of what's shown above as FibreChannel.
The important difference, however, is fairly simple: with file level virtualization, the server/NAS typically tries to supply a number of file sharing protocols, in the hope the every client you care about will understand at least one of them. Likewise, most clients try to support many protocols, in the hope that you'll be able to connect to every server you care about.
In the case of block-level virtualization, there's (at least theoretically) just one set of commands that essentially all operating systems know how to use, so the server mostly just supports that one set. The catch is that SCSI commands have been around for many generations, and many subsets have been defined. So, even though they're theoretically just dealing with one set of commands, lots of variation is possible.
At the same time, you really only need a fairly small number of commands to store and retrieve files on a block device (virtual or otherwise). Lots of the more advanced commands are for things like migrating data transparently, doing backups with minimal client intervention, and so on. They add a lot of useful capabilities, but aren't strictly necessary for the simple task of letting clients store files on a disk array.