Yes a custom control would be a good idea. Also, M-V-VM is a must in a situation like this; it will reduce the complexity of your app greatly.
I'd take a UniformGrid and use Buttons as the squares. You'd have to create a tri-state custom button if you want to add in the "?" intermediate state.
The model for the button would look like
public class MineSquare : INotifyPropertyChanged
{
// exploded, number, or nothing
pubic ImageSource ButtonImage {get;private set;}
// true, then goes to false when clicked
public bool CanClick {get; private set;}
// bound to the Command of the button
public ICommand Click {get; private set;}
}
You deal with the model in code rather than the controls. Drop in nine MineSquares into an ObservableCollection on your ViewModel bound to your UniformGrid and you have a 3x3 minesweeper game. Each button handles its own logic. You can hook into the models via the view model to iterate over all squares and determine if everybody has been clicked.