I’ve connect a Button (V1.4) on socket 4 on FEZ Spider II and same button on FEZ Panda III (pin3 -> D3, pin4 -> D2).
Value of reading is always correct, but event is only raised on FEZ Panda III.
Here is code (I change mb value when changing mainboard):
using System;
using System.Threading;
using GHIElectronics.TinyCLR.Devices.Gpio;
using GHIElectronics.TinyCLR.Pins;
namespace testButton
{
    enum Mainboard
    {
        FEZSpiderII,
        FEZPandaIII
    };
    public class Program
    {
        private static GpioPin _led;
        private static GpioPin _btn;
        public static void Main()
        {
            Mainboard mb=Mainboard.FEZSpiderII;
            GpioController gpio = GpioController.GetDefault();
            if (mb == Mainboard.FEZSpiderII)
            {
                _led = gpio.OpenPin(G120E.GpioPin.P2_0);
                _btn = gpio.OpenPin(G120E.GpioPin.P2_31);
            }
            else
            {
                _led = gpio.OpenPin(FEZPandaIII.GpioPin.D2);
                _btn = gpio.OpenPin(FEZPandaIII.GpioPin.D3);
            }
            _led.SetDriveMode(GpioPinDriveMode.Output);
            _btn.SetDriveMode(GpioPinDriveMode.InputPullUp);
            _btn.ValueChanged += Btn_ValueChanged;
            for (int i = 0; i < 4; i++)
            {
                _led.Write(GpioPinValue.High);
                Thread.Sleep(200);
                _led.Write(GpioPinValue.Low);
                Thread.Sleep(200);
            }
            while (true)
            {
                _led.Write(_btn.Read()==GpioPinValue.Low?GpioPinValue.High : GpioPinValue.Low);
                Thread.Sleep(20);
            }
        }
        private static void Btn_ValueChanged(object sender, GpioPinValueChangedEventArgs e)
        {
        }
    }
}