Nested for loops is a good way to start, because the board you want to be drawing later on has two dimensions: board[i][j] is the variables I have given mine. argv is the number (don't forget atoi!) that gives the board its dimensions, both in height and width. So what you want to do first is to iterate the first for loop along the rows, while the nested for loop will iterate along the columns (You can also do it vice versa!) until the lower right hand corner of the board is reached.
Be careful though: The numbers shall be drawn in descending order, so you have to think about a way to include this in the initialisation function as well.
Also don't forget that tiles 0 and 1 need to be swapped when the number of tiles is uneven, i.e. when the board dimensions are even!
This is much easier than the init function, because after initialising the board, you have saved the board already in your board[i][j] two dimensional array! You simply have to draw, or print it. Again, nested for loops is a good way to do this: The outer for loop can again iterate over the rows, while the nested for loop iterates along the columns (I always do it this way round). In order to print use
printf("%2d ", board[i][j]);
This should be part of your nested for loop. Note that I have included a space to make to board look prettier; you can also draw a new line after each iteration of a row, so that there are spaces left, right, top, and down.
I hope this helps, if not let us know.