Raymond will be doing a more thorough examination of boxing and unboxing in the near future, so I am just going to do a quick visit (very quick) per Brendan's comments in my post: Overriding System.Object.ToString() and Implementing IFormattable. Check the comments for details.
For a more thorough description of Boxing in a book, I recommend buying Jeffrey Richter's Applied Microsoft .NET Framework Programming. It is one of the few books that has snuck out of my office and into my lanai for casual reading in the backyard.
Boxing occurs when a method, for example, is expecting a reference type and gets a value type. When this happens, the C# compiler automatically detects that boxing needs to occur and emits the necessary IL code for it to happen. In general, boxing has a negative impact on performance and can actually cause bugs if you aren't fully aware of its consequences. I will let Raymond elaborate more on that in his post.
One of the overloaded Console.WriteLine methods looks like this:
As you can see, Console.WriteLine is expecting reference types (i.e. Object), not value types. If you use this overloaded method and pass it a value type as one of the arguments, boxing will occur. There are no warnings or compiler errors. The compiler will emit the necessary IL code to box the value type (i.e. convert it to a reference type for you) and you are none the wiser (unless you look at the IL).
Here is example code for which boxing occurs. Notice that I am passing the integer x (value type) directly to Console.WriteLine (look way down in Main()). This will cause boxing which you can see in the IL code.
In the following example, boxing does not occur. I pass x.ToString() into the Console.WriteLine method (again way down in Main()), which is a reference type and thus does not need to go through the boxing process.
That is the 10 cent tour of boxing!