If your gravity vector is purely vertical (let's call it the Y axis) and there is no side wind to take into account, the XZ position of the projectile follows a straight line. If you do not have resistance to air, then it moves along this line at a steady pace, just like our friendly linear ray emissions!

We can project a "shadow" of the projectile directly on the XZ plane. We can determine the squares of the grid on this plane through which this line passes using your ordinary 2D scatter / scroll algorithm (or some other online rasterization algorithm like Bresenham). I show an example of this type of raymarching in this answer.

With this we can calculate flight time when shadow intersects each new box along its way. This tells us when the 3D projectile enters itself into a new column of voxels.

By calculating the height at each column entry timestamp, using:

$$ vec p (t) = vec h_0 + vc v_0 cdot t + frac { vec a} 2 cdot t ^ 2 $$

… then we can get the height at which the projectile enters and leaves each column.

The other height we need is the height at the top of the parable. This is the only point where the projectile can touch voxels in a column outside the range from its entrance to the exit height. We can find this point with:

$$ t_ * = frac {-v_y} {a_y} $$

We can now review each of these key timestamps in sequence, since entering a new column of voxels and moving up / down this column to the next timestamp (either the vertex or the entry in the next column). This ensures that we visit every voxel touched by the dish, with only a small amount of work beyond the basic 2D raycast.