I'm not sure what is your problem.
An alpha shape code starts with a delaunay tessellation (at least mine does.) It erodes any simplex that fails the alpha shape criterion, one simplex at a time. What remains is still a tessellation of the domain.
Next, I would find the outer boundary of that complex, by listing all facets (in 2-d, these are simply edges) of each simplex. These edges are defined by pairs of indexes into the list of vertices. Look for duplicate facets, and exclude all edges that appear twice in the list. (Make sure that you catch edge [1,2] as a duplicate of edge [2,1].) What remains in the list must be only those on the outer surface since they are unshared facets.
Thus in 2-d, we now have a list of edges that comprise the enclosing polygon, which may be concave depending on the value of alpha to generate that alpha shape. Connect the edges into a polygon, traversing one to the next in order. Again, since the list of edges is really a list of references into the list of vertices, that ordering will be simple. If your choice ends up the counter-clockwise polygon, flip them.
Edit:
Perhaps the only way to explain this is by an example. I'm using my own set of tools to compute the alpha shape, etc., but the ideas are the same no matter what tools you use. All computations were done in MATLAB.
I'll start with 121 lattice points in the plane, then exclude a few, by taking a bite out of one edge, thus excluding 34 of those points.
xy = lattice({0:.1:1,0:.1:1})
xy =
0 0
0 0.1
0 0.2
0 0.3
0 0.4
0 0.5
0 0.6
0 0.7
0 0.8
0 0.9
0 1
0.1 0
0.1 0.1
...
1 0.7
1 0.8
1 0.9
1 1
>> k = sqrt(sum(bsxfun(@minus,[.8 .5],xy).^2,2)) < .35;
>> sum(k)
ans =
34
>> xy(k,:) = [];
>> plot(xy(:,1),xy(:,2),'o')
Now, I can form a triangulation of that set. Again, I'll use my own tools, but in matlab, delaunay.m does exactly this.
>> tri = delaunayn(xy)
ans =
84 79 83
86 80 85
75 79 84
84 66 75
75 66 71
85 80 76
76 67 85
...
The tessellation itself is simply a set of references. Each row of that array is one triangle, so we have one of the triangles as [84 79 83], which are references into those points from our original point set. The triangulation is like this:
Note the long facets that span the hole along the right edge. Now, compute an alpha shape. The maximum nearest neighbor distance is 0.1, so here I'll use an alpha ball of radius 0.2 (twice the maximum nearest neighbor distance.)
>> sc = alphashape(xy,.2);
>> tria = sc.tessellation;
So the alpha shape is in yellow, with black edges for its triangles. I've overlaid the delaunay triangulation on top, with blue edges.
The alpha shape has 130 triangles in it, since each triangle has 3 edges, I will have a list of 130x3 = 390 edges, some of which are replicates. There really are only 216 edges in that list.
>> edgelist = [tria(:,[1 2]);tria(:,[1 3]);tria(:,[2 3])];
>> size(unique(sort(edgelist,2),'rows'))
ans =
216 2
What we wish to see however, are only the edges on the boundary of that alpha shape. These edges are those that appear in the list exactly once. Some careful sorting can resolve the boundary edges.
>> sortrows(sort(edgelist,2))
ans =
1 2
1 12
2 3
2 12
2 12
2 13
2 13
2 14
2 14
3 4
3 14
3 14
3 15
3 15
4 5
4 15
4 15
5 6
...
Thus we see that edge [1 2] appeared once in the list, but edge [2 12] shows up twice, as does edge [2 13]. These latter edges are interior edges that we wish to remove if we want to see the boundary. In MATLAB, I'd do it like this to remove those that appeared twice in the list:
>> k = find(all(diff(sortrows(sort(edgelist,2))) == 0,2));
>> edgelist(k,:) = []
edgelist =
79 83
80 85
75 79
76 80
50 51
60 61
49 50
67 68
58 59
78 82
1 2
2 12
10 21
10 20
...
42 edges remain in the 1-manifold representing the boundary polygon.
I still am not sure where you got stuck, but that should clear up some issues. Just use those 42 edges as your polygon, connecting the dots. How you should do this in your favorite language is nothing I can solve, since I don't even know what that is.