A fast way to do this in numpy (without doing all the work to generate a list of lists in Python, just to convert it to numpy at the end and get no vectorization benefits during construction) is:
# Make a range of floats from 0 to 8, double each one in place, then reshape it
# so it becomes nine two-element subarrays that look like:
array([[0., 0.], [1., 1.], [2., 2.], ... [7., 7.], [8., 8.]])
xcount1 = np.arange(9, dtype=float).repeat(2).reshape(9,2)
xcount1[:, 0] //= 3 # Divide first element of each two element subarray by 3
xcount1[:, 1] %= 3 # Reduce secodnd element of each subarray modulo 3
# xcount is now *exactly* what you expected
print(xcount)
which outputs:
[[0. 0.]
[0. 1.]
[0. 2.]
[1. 0.]
[1. 1.]
[1. 2.]
[2. 0.]
[2. 1.]
[2. 2.]]
Your original code didn't work because numpy.append, when not provided an axis argument, flattens both input and output before appending, so you lose your structure. I'm not sufficiently expert with numpy to make it build the correct way from scratch using append (that said, np.append is incredibly slow, making a copy every time, so it's a bad solution anyway), but it's easy to reshape it once you're done. Just add:
xcount1 = xcount1.reshape(9,2)
to the end of your code and it will reshape it to match the groupings you intended (though it would be much slower than my code, or even just xcount1 = np.array([[i, j] for i in range(3) for j in range(3)], dtype=float) which doesn't benefit from any vectorization, but for small enough inputs it doesn't really matter).