Your code will compile with Option Strict Off but it will fail at run time. With Option Strict On (as it should always be) it will refuse to compile.

If you derive the ListEx class from the List class then you can assign a ListEx object to a List variable because every ListEx is a List. You can't assign a List object to a ListEx variable though, because not every List is a ListEx. As is always the case with OOP, just look at the real world for examples. Every Dog is an Animal so you can assign a Dog object to an Animal variable but you can;t assign an Animal to a Dog variable because it's not necessarily a Dog.

Quite frankly, this:
I just like to redefine most of system classes I use in case I need to extend theme later.
is silly. If you need to extend them later then extend them later. Why put wings on your car just in case you might want to fly later? Put the wings on if and when you want to fly. A far more sensible approach would be to simply create a helper class, e.g.
vb.net Code:
  1. Public Class ListHelper
  2.  
  3.     Public Shared Function Create(Of T)(ParamArray items As T()) As List(Of T)
  4.         Dim list As New List(Of T)
  5.  
  6.         list.AddRange(items)
  7.  
  8.         Return list
  9.     End Function
  10.  
  11. End Class
Now you are still going to be dealing with vanilla List objects.