File-level caching also has a lot of disadvantages. First and foremost, as you mentioned, it has to be tailored to specific file systems, like NTFS. For Linux and Unix OSs, there are so many file systems that porting file-level caching software to every one of them would be a nightmare. Linux/Unix has a generic block layer, so block-level caching software written for Linux/Unix is file system independent.
Second, the list of heuristics can easily spiral out of control. You might not want to cache a video file of a movie you're watching, but you probably would want to cache a video file of a movie you are editing. You have to know where the file came from, where it's going, how fast you want it to get there (i.e., priority), what programs are using it, etc. There's just too much contextual metadata that needs to be tracked; the more complicated the contextual metadata is, the more complicated the heuristics need to be. Also, statically defined heuristics may be inappropriate for dynamic environments.
Third, why cache an entire file if you're only working on a very small percentage of it? I have to admit, some file-level caches will only cache the "popular" portions of files, but in that case, why not just use a block-level cache and enjoy its better performance?
Also, I'm confused about "there are a lot fewer blocks than files," did you mean that the other way around? If you have a single 100 MB file, and the system's block size is 4K, you have a lot more blocks than files. There may be a smaller memory overhead with a file-level cache, but there's a greater CPU overhead due to all the contextual metadata and heuristic processing.