The .c files contain the source, the code for each particular function, or the actual definition of variables. (say like uint8_t counter = 0; as a global variabele)
The header files just contain descriptions, like structs, unions, macro's, and function prototypes. They indeed should not contain code.
You can look headers as a sort of blackbox principle: the headers are the outside of the box (what are my connections), the source is the inside of it (how does it work). With the headers you can use the code of the source file (or a library file for that matter) without knowing how it exactly is put together.
Compilation exists of 2 steps: compiling to an intermediate format (object code) and linking that format to a final image. It doesn't compile all source files at once; it does this one at a time.
Put simply, during compilation the compiler doesn't know where everything will end up absolutely, so it may mark stuff like: "use this variable here, call this function here". It can only do that if it knows how the function looks like (parameters) so it knows how to call it, and also what type exist etc.
The linker puts the whole program together and "links" everything together.
I haven't ever had the need to use library projects before. In most cases, the compiler & linker is pretty flexible. I would only use library files if I would want to hide the source code from the "user" (developer).
In that case, also, you would need header files to describe what's in the library, and how each function is called.
Why it won't allow you to select XPASM I don't know. At my installation (v2.05) I can select XC16 or XC8 for a library project.. Have you selected the right chip in the wizard?