An 8x8 matrix which contains either pointers (c++) to piece objects or references (c#/java) seems like a very reasonable design.
You could use an 1D array that is 64 elements big (you can easily map 2D indexes to a 1D array) and use something like this:
using System;
using System.Linq;
Piece[] board = whatever();
// New random number generator.
Random random = new Random();
// LINQ query orders each element by the next random number.
Piece[] randomBoard = (from piece in board
orderby random.Next()
select piece).ToArray();
NOTE: I'm not a c# programmer, but this seems reasonable.
To convert an x,y pair to an array index, you use this algorithm:
int index = (y * 8) + x;
NOTE2: I don't know if you have to follow placement rules of checkers or not, if you do, you need to do something more clever. You could maybe have an array 32 elements big (representing all black squares). Shuffle around in that, then assign each element in the 32 big array to each "black" square of the real 64 element array.