To any others facing this problem in the future, I believe I found the solution:
The MATLAB contours function creates coordinate data that (when the shape is closed) has a coordinate point that starts and ends on the same point. The decsg function, however, only asks for the coordinate point at the beginning point of the edge for a polygon, this was causing problems when run iteratively - but was fine when run for one contour line (as I mentioned in the question above).
Removing the final point from the contour line data resolved the problem:
for i = 1:n_contours
x = A{1,i}(1,:);
y = A{1,i}(2,:);
% Contour geometry description
S(i+1,1) = 2;
S(i+1,2) = numel(x(1,:))-1; %introduced this -1
k = 2;
for ii = 1:(numel(x(1,:)))-1 %introduced this -1
k = k+1;
S(i+1,k) = x(1,ii);
end
k = numel(x(1,:)) + 1; %this is now +1 rather than +2
for jj = 1:(numel(y(1,:)))-1 %introduced this -1
k = k+1;
S(i+1,k) = y(1,jj);
end
% Names each contour formula iteratively
cf_i(i,:) = ['S',num2str(i)];
end