Hmm. I just tried batching this on a per session basis, using the All-Session contrast to define the ROI. I got the same xY.XYZmm values, but the eigenvariates are slightly different.
Here is the code from the job file (I edited out the filenames and commented):
matlabbatch{1}.spm.util.voi.spmmat = {'Directory/GLM_for_DCM/SPM.mat'};
matlabbatch{1}.spm.util.voi.adjust = 15; % Number of F-contrast for run 1
matlabbatch{1}.spm.util.voi.session = 1; % run 1?
matlabbatch{1}.
spm.util.voi.name = 'Calcarine_batch';
matlabbatch{1}.spm.util.voi.roi{1}.spm.spmmat = {''};
matlabbatch{1}.spm.util.voi.roi{1}.spm.contrast = 14; %Number of T-Contrast of Interest for All Sessions (not run 1)
matlabbatch{1}.spm.util.voi.roi{1}.spm.conjunction = 1;
matlabbatch{1}.spm.util.voi.roi{1}.spm.threshdesc = 'none';
matlabbatch{1}.spm.util.voi.roi{1}.spm.thresh = 0.05;
matlabbatch{1}.spm.util.voi.roi{1}.spm.extent = 0;
matlabbatch{1}.spm.util.voi.roi{1}.spm.mask = struct('contrast', {}, 'thresh', {}, 'mtype', {});
matlabbatch{1}.spm.util.voi.roi{2}.mask.image = {'Directory/Intracalcarine.img,1'};
matlabbatch{1}.spm.util.voi.roi{2}.mask.threshold = 0.5;
matlabbatch{1}.spm.util.voi.roi{3}.sphere.centre = [0 0 0];
matlabbatch{1}.spm.util.voi.roi{3}.sphere.radius = 8;
matlabbatch{1}.spm.util.voi.roi{3}.sphere.move.global.spm = 1;
matlabbatch{1}.spm.util.voi.roi{3}.sphere.move.global.mask = 'i2';
matlabbatch{1}.spm.util.voi.expression = 'i1&i2&i3';