To answer your question, it looks to me like your original code does not work because of the LINQ query you are trying to use.

objects.FirstOrDefault(Function(o) o.Bounds.IntersectsWith(Ball.Bounds))

This code says give me the first (or default) object in the objects array, where the object intersects with the ball object. However since the ball object is part of your array of obects, it will always be returned, since its bounds will intersect with itself technically if you are just comparing bounds. So your collide variable is always going to contain the ball picturebox (it will never be nothing).

Here is intersection checking code that will work:

Code:
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        Dim collide = Ground.Bounds.IntersectsWith(Ball.Bounds)

        If Not collide Then
            Ball.Top = Ball.Top + 2
        End If

    End Sub