Sorry I didn't see this sooner, I ran into a pretty similar situation recently. The products I test can widely differ in their arrangement and number of relays that I need to monitor. The way I decided to get around having to re-write the program each time we get a new model was to lock in a naming scheme for the points and move them to the appropriate pointer tables based on the names using the "GetPointerFromName" command.
So in my control strategy, the points are named something like C01_240Input_R01_00_00. The C01 refers to the sample number (I typically test up to 12 identical samples at once). The 240Input tells me what kind of I/O point it is. R01 tells me which rack it is. The first set of 00 tells me which module on the rack, and the second set of 00 tells me which point on the module. Then I index through each possible point configuration and build a string based upon the current indices and use the GetPointerFromName to attempt to grab the I/O point. If it is null, it just returns and indexes to the next point. If it is a valid pointer, then I move it to the pointer table for that particular sample on test. In some samples element 2 may be a widget while in other cases it's a wocket, so then all that's left is for me to put the correct names into a String table with the same number of elements as the pointer table.
The chart that sets the configuration up is called on the startup of the Display program, but after that it shouldn't need called again for the duration of my testing (3+ months at a time). Things to be wary of, depending upon your hardware it could take a while to index through and move all the correct points to the right pointer tables. So filtering in the index routine should be used wherever possible, for example if you know the first 8 modules will NEVER change, then you might as well leave those indices out of the loop. Or if you know you aren't using an HD modules, only index to 4 points per module instead of 8 or 16 or 32. For reference, it takes maybe 10 seconds to index through the ~300 points in my setup, so it's not debilitating or anything - it'd just be a nuisance to have to wait that long if I had to re-initialize it multiple times per day.
I'm almost certain your implementation will be vastly different from mine, but I figured I'd share my method to attack our common issue to hopefully inspire you to your solution!