You can't do sophisticated GC in C. The memory model of the JVM is important - it knows what is a pointer and what is data, which is important for efficient GC.
If course you can. But you will have to write a memory manager for that and make the compiler keep track of what your pointers point to. I don't know enough about Vala to say it's not desirable given its syntax and what it assumes about the memory management the program does, but it's not impossible.
actually, you can do consevative GC in C just fine without any special support in compiler, see Boehm's GC. Which is actually what was until recently used in Mono and also extensively used by various other runtimes (gnu java, ecl, many scheme implementations...)
Well, the only difference you see is that you call GC_malloc() instead of malloc() (and that can be redefined, even link-time), and that on some platforms (at least Cygwin and AIX, maybe also Solaris) you need to call GC_INIT() from main().
Yes, but that should be placed in the C code, not in the Vala sources. Assuming it's a c#/Java-like language, the programmer should be spared from this job.
In case of Vala I think that required modifications are pretty well limited to underlying runtime library (gobject) and do not touch compiler too much. But on the other hand they will be quite invasive across whole Gtk/Gnome platform.