Its as scali said. since the "include" directive literally means "Take this code, copy it here". The problem you run into with overly big projects is that you don't want to have all your source code in just one file. The include with prototypes allows you to split them up nice and neatly.
It comes down to the way C was set up initially (and honestly, most compiled languages are this way). The compiler was meant to go through one file at a time and the linker was supposed to hook those files together. While resources may have been part of the equation, they aren't the full thing. A big part of it was looking for a method to make things modular. That is the true purpose of header files.
Modern compilers have the same issue, they just handle it differently. Rather then working as just a compiler, modern compilers are more prone to work as both compiler and linker. So in the end, the VS C# compiler is really just saying "Ok, I don't know where this function is, I'll find it later" and then throwing an error if it is never found. The issue that arises with this method is you have to feed to the compiler all the files that are going to be compiled. That runs into a whole slew of problems (which are apparently not considered too big of issues) such as the fact that you can't modularly build a project. IE make a change to one file and not have to rebuild then entire project.