That original code will only work if you have Option Strict turned Off, which you should not. Every self-respecting developer should turn Option Strict On, in which case that code would fail twice. The third line is implicitly converting a String to a Date and the fourth line is implicitly converting a Date to a String.
Relying on implicit conversions may seem advantageous because you don't have to think so much about the types of the values you use. As a result though, people tend to not think about things that they should. With Option Strict turned Off your code will be slower to execute and more error-prone.
Option Strict being Off is the only reason that the code in your second post compiles too. With Option Strict On you'd be told that the String couldn't be implicitly converted to a Date.
I cannot suggest strongly enough that you turn Option Strict on, leave it on and perform all your conversions explicitly. You will become a better developer faster as a result. I would never even consider hiring someone who worked with Option Strict Off.
Having said all that, if you still want to be able to implicitly convert your type to String then you have to implement the CType operator:
Public Class SomeClass
Public Shared Narrowing Operator CType(ByVal value As SomeClass) As String
Return value.ToString()
End Operator
Public Overloads Overrides Function ToString() As String
Return "Hello World"
End Function
End Class
When an implicit conversion is made the types CType operator is invoked. If the CType operator is not implemented for the type being converted to then the conversion fails. The DateTime type has a CType operator defined for the String type so implicit conversions from DateTime to String are possible. If you do as I did above then implicit conversion from your type to String will also be possible. If you want to be able to implicitly convert to other types too then you will need to overload the CType operator and change the return type.
As for your last question, it's just not possible. You can implement your own class such that it possesses the functionality to convert an instance of itself to a String. You cannot change the implementation of the String class though, so you can't make able to convert itself to your type.