Scusate ma perchè tutto questo sbattimento per fare una lista dinamica di oggetti di tipo diverso? Come ha già detto MItaly ogni classe di .NET è figlia della classe Object. Tu fai un oggetto di tipo ArrayList che contiene in automatico oggetti di tipo Object, poi estrai il tipo dell'oggetto in base all'esigenza tramite la Reflection:

codice:
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList lista = new ArrayList();
            lista.Add("ciao");
            lista.Add(32);
            lista.Add(14.5);
            lista.Add(new MioOggetto(1231219));

            foreach (object obj in lista)
            {
                if (obj.GetType() == typeof(MioOggetto))
                    Console.Write((obj as MioOggetto).Telefono.ToString() + "\n");
                else
                    Console.Write(Convert.ChangeType(obj, obj.GetType()).ToString() + "\n");
            }

            Console.Read();
        }
    }

    public class MioOggetto
    {
        private int _tel;

        public int Telefono
        {
            get { return _tel; }
            set { _tel = value; }
        }

        public MioOggetto(int tel)
        {
            Telefono = tel;
        }
    }