I came up with a cool solution when I was making a restaurant scene with a soda (which I’ve now abandoned). It’s sort of cheating, but then again, all of CG is cheating anyway
Ice is much more than just a clear cube. Good looking ice has many layers, and actually has quite a foggy interior because of the way it freezes (although as a side note, I have heard that if you freeze filtered water that is boiling, the ice will be perfectly clear).
Here is my scene with the ice in the glass:
Here is the ice cube model itself:
As you can see, it’s broken up into several layers. The inside meshes (outlined in green, and which are all part of the same object) are progressively smaller and smaller, so what happens is the semi-transparency of the inside ice builds up on itself to make a very interesting volume. Also inside the outer “shell” is a few planes randomly rotated and overlapping. This creates the cracks on the inside of the ice that you often see.
The whole object is made of two materials: the outside ice and the inside ice. The outside ice material is purely for the outside mesh, leaving the inside material for everything inside the shell. The outside material is a simple glass material with the roughness controlled by a procedural noise texture. The IOR is 1.31, which is the refractive index of ice. Because this effect was not quite “foggy” enough for me, I also used the noise texture to mix the glass shader very very slightly with a diffuse shader, set to white. Finally, I used this setup to ensure that the outside would cast no shadows on the inside.
The inside material is a bit more complex. I mix a diffuse shader with an emission shader, set to a low amount, then mix this with another glass shader. Finally, I add the same light path setup so that the inner objects do not cast shadows on themselves either.
Though it’s not physically correct per se, it looks good in most situations and is pretty easy to do (though for a close up you may get better results with a different approach).