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



