##C#, 274 bytes
C#, 274 bytes
Direct copy from my answer on another question (it was popularity, but I just treated it as golf). Never did get around to golfing it further.
class
P{static
void Main(){
for(int i=99;i>0;
)System.Console.Write
(i+"{1}{2}{3}, {0}{1}{2} of beer.\n"+(i>1?
"Take one down and pass it around, {4}{1}{5}{3}.\n\n":
"Go to the store and buy some more, 99{1}s{3}."
),i--," bottle",i>0?"s":"",
" of beer on the wall"
,i,i>1?"s":""
);}}