You must insert:
//Load from stream example
st:= TStringStream.Create;
StringGrid1.SaveToCSVStream(st);
ShowMessage(st.DataString);
StringGrid1.Clean;
st.Position:=0; // <--
StringGrid1.LoadFromCSVStream(st);
st.Free;
Because, the position of the stream after saving is at the end of the stream. And when you try to read from the stream again it will read from the end of the stream. But there is nothing to read, so it is empty.
You must set the position to Zero (0) after saving a stream.