I've tried the following but it returns a weird string:
Encoding.Default.GetString(buffer);
Here's my byte array. I want to convert it to "8.31.99.141".

It appears that this is a misunderstanding. A byte's value does not directly relate to a string's character representation. That is to say that the byte 8 is not necessarily "8" in a string. The act of converting between bytes and characters is called Encoding.
You can test some encoding yourself:
var testString = "my test string";
var bytes = Encoding.Default.GetBytes(testString);
var confirmString = Encoding.Default.GetString(bytes);
To output the byte value directly as a string, use this:
var result = string.Join(".", bytes);
This will implicitly call .ToString() on the bytes, which returns the byte value as a string. Note that this is MUCH different than encoding.
It seems you need String.Join :
string result = String.Join(".", lol);
IEnumerable<T>: msdn.microsoft.com/en-us/library/dd992421%28v=vs.110%29.aspxString.Join(".", buffer.ToList().Select(i=>i.ToString()));
buffer is redundant and undesirable; the extra list, the iterator, the delegate, etcIf your buffer length may differ:
var result = string.Join(".", buffer);
If length is always fixed to four (like for an IP adress for example), this reads better IMHO:
var result = string.Format("{0}.{1}.{2}.{3}", buffer);
Of course this is assuming you want the string representation of each individual byte.