John, just to give some explanation: push! is there as an efficient push operation - one that ideally takes O(1) time because it simply extends the vector in-place rather than copying everything to a new vector. (In practice, though, it takes slightly longer than O(1) time because of the overhead of occasionally allocating a new array). Julia stores arrays in column-major order, so you can push a new column on to a matrix by pushing the column to a 1d array and then reshaping, as Ivar said. But you can't do the same with rows, because there is no way to append a new row to a matrix in an in-place fashion. You have to shift all the array elements around in memory.
The suggestions above are both good, and another way would be to simply create row matrix by appending columns instead. At the end, just transpose the matrix. The transpose operation does add O(n) overhead but depending on what you're doing a single transpose at the end could be much more efficient than cat'ing at each iteration.