surface plot from 2D slices

Great, well, depending on how concerned you are about efficiency you might need to try some more sophisticated methods, but I’d suggest starting with something simple that you can use as a baseline.

As an example, here’s an easy way to make a volume node with random data in it. Run this in the python interactor and you should be able to see the random noise in the slice views.

n = slicer.mrmlScene.CreateNodeByClass('vtkMRMLScalarVolumeNode')
n.SetName('my volume')
slicer.mrmlScene.AddNode(n)
import numpy
slicer.util.updateVolumeFromArray(n, numpy.random.sample([30,30,30]))

Working from there you could make an array of zeros instead, and then iterate through the OCT slices and just copy (or interpolate) the pixels into the corresponding voxels. Since you have the jpg files loaded you can get them as numpy arrays with slicer.util.arrayFromVolume(volumeNode).