Warning: It appears that in version 9 this tends to crash the kernel. Beware and save your work before trying!
Here's a starting point. It needs a lot more polish.
First, make a bottle:
{p1, p2, p3, p4} = Table[{i, 0.5}, {i, 4}];
if = Interpolation[{{0, 1/2}, p1, p2, p3, p4, {5, 1/2}}];
Column[{
LocatorPane[
Dynamic[{p1, p2, p3,
p4}, ({p1, p2, p3, p4} = #;
if = Interpolation[{{0, 1/2}, p1, p2, p3, p4, {5, 1/2}}]) &],
Dynamic@Plot[if[x], {x, 0, 5}, PlotRange -> {{0, 5}, {0, 1}}]],
Dynamic[
bottle =
RevolutionPlot3D[{if[x], x}, {x, 0, 5}, PlotStyle -> Opacity[0.5],
Mesh -> None]]
}]
Then fill it and animate it:
volume = Derivative[-1]@FunctionInterpolation[if[x]^2, {x, 0, 5}]
Table[Rasterize@
Show[bottle,
RevolutionPlot3D[{0.95 if[x], x}, {x, 0,
InverseFunction[volume][t]}, Mesh -> None,
PlotStyle -> Blue]], {t, 0.1, volume[5], 0.1}] // ListAnimate