I only see one work coordinate in your program. You need multiple work coordinates in all the locations you want to cut parts. You can put them in by hand in all the G54, G55, etc values or by using G52 X Y to create 'child' coordinates.
A similar problem was discussed in this thread; Automatic work shift on lathe, is it possible?
This is for a lathe but the same principles apply. Look particularly at Post #19 it describes a macro for calculating values to use with G52. You would need to extend it to two values that step out a grid.
If your controller can handle multi-nested subroutines it is possible to do the same thing but then your actual program has to be written in incremental.