From a real basic programming perspective, in C# if you need a method to get, derive, produce, instantiate, or otherwise communicate something back to the caller you use a function with the appropriate return type.
If you need a method to just do something and you don't need anything from it, use a void.
Too Long; Did Not Read Info:
Functions return control to the caller upon completion along with a value or reference to some kind of product; a void is a special case function that has no corresponding product...it is kind of the type equivalent of null.
Some languages specifically differentiate between functions (methods that return a value) and subroutines (methods that do not return a value). C based languages instead use "void" to differentiate between them.
In C# specifically, void is internally mapped to a struct with some strange compiler enforced behavior; you can't really use this type for anything useful but if you are doing reflection you might notice it and think "hrm?":
http://msdn.microsoft.com/en-us/library/system.void.aspx
Eric Lippert, until recently a principal developer on the C# compiler team, had some interesting things to say about void a few years ago; it might provide some insight for you:
http://blogs.msdn.com/b/ericlippert/archive/2009/06/29/the-void-is-invariant.aspx
Note that you could simulate functions using voids, via out or ref parameter(s) but this would be needlessly verbose and I daresay inelegant; functions are much cleaner and easier to read and write.
Personally, when I use a void it is usually for a private or protected method or to follow a design pattern. I tend to favor functions for public methods; even if only to return true / false to allow a feedback loop for the caller(s) or to assist in unit testing.