Design Min-Max trees? Don’t know exactly what you mean… I pretty much used standard textbook algorithms.
How I represented my board? Well, I keep a list of pieces for each player, and I store the location of each piece. I also store in each square, information about the piece, if any, that is in that square. I believe I held the color and piece separate, as two enums. I even calculated and updated the “pressure” on each square. (The number of pieces of each color that can attack that square.) All of this is updated when a piece is moved.
I took a quick look at your source and I have on suggestion for you: Don’t use row+col to reference your squares. Just number the squares from 0 to 63. That way, each square is represented by a single integer, which is both faster and more convenient. And also easier to store lists of valid moves as position offets. For example, the list of legal moves for a king would be {8, 7, -1, -9, -8, -7, 1, 9}. This is much better than generating every move and seeing if it’s legal!
One common representation is called the “and 0x88” board. In it, the board positions are numbered from 0 to 127, 8 rows of 16. You only use the leftern 8 columns; the rest is wasted. The cool thing about this is, while you’re sliding a piece, you can check whether it’s gone off the board or not simply by And-ing it with 0x88! (position P is inside if (P & 0x88)==0)