An exact method:
First consider intersecting the surface with the half-space delimited by a plane.
Some of the triangles are wholly inside the half-space and remain unchanged. Some others are wholly outside and are discarded. The remaining ones are cut in two, giving a triangle and a quadrilateral. Keep the right part and triangulate the quadrilateral if necessary.
You also need to consider the face generated as the region of the plane that lies inside the surface. For this, take all the new edges (those resulting from the section of the triangles with the plane), and chain them. I mean tie together the segments that have a common vertex (take care of numerical accuracy); in the end you will have one or more loops, forming simple polygons. Triangulate those polygons (by the ear clipping method for instance).
By this process, you obtain a new triangulated surface which describes the requested intersection. Repeat for the six planes that define a cell, and you get the intersection between the cell and the volume enclosed in the surface.
To compute its volume, you can sum the volumes of the prisms formed by every triangle and its projection on a fixed plane; make sure to compute these volumes algebraically (with a sign).
Here is a 2D analogy. The "new edges" are in green.

As this process is time consuming, it will be costly if you need to repeat it for each cell of a whole grid. You can ease the computation by keeping intermediate results and working slice by slice.
A sort in the direction perpendicular to the first plane will accelerate the rejection of outside triangles.